package cn.itcast.service.cargo.impl;

import cn.itcast.dao.cargo.*;
import cn.itcast.domain.cargo.*;

import cn.itcast.domain.vo.ExportProductResult;
import cn.itcast.domain.vo.ExportResult;
import cn.itcast.domain.vo.ExportVo;
import cn.itcast.service.cargo.ExportService;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;


import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;

@Service
public class ExportServiceImpl implements ExportService {

    @Autowired
    private ExportDao exportDao;

    @Autowired
    private ExportProductDao exportProductDao;

    @Autowired
    private ContractProductDao contractProductDao;

    @Autowired
    private ExtCproductDao extCproductDao;

    @Autowired
    private ExtEproductDao extEproductDao;
    @Autowired
    private  ContractDao contractDao;



    @Override
    public Export findById(String id) {
        return exportDao.selectByPrimaryKey(id);
    }

    /**
     * 添加报运单：
     * 1、添加报运单信息 co_export
     * 2、添加报运的商品 co_export_product
     * 3、添加商品附件   co_ext_eproduct
     */

    @Override
    public void save(Export export) {
        //1. 设置报运单信息：id、创建时间、状态、货物数量、附件数量
        export.setId(UUID.randomUUID().toString());
        export.setCreateTime(new Date());
        export.setState(0);
        //2. 获取购销合同id，多个id用逗号隔开，比如：'1,2'
        String contractIds = export.getContractIds();
        String[] arrays = contractIds.split(",");




//自主题目：需求：、对于已经生成过报运单的购销合同，需要修改购销合同的状态，state改为2
        //1.根据购销合同id得到购销合同
        //把数组转换成集合
        List<String> asList = Arrays.asList(arrays);
        for (String id : asList) {
            Contract contract = contractDao.selectByPrimaryKey(id);
            //2.设置购销合同状态
            contract.setState(2);
            //3.提交修改数据
            contractDao.updateByPrimaryKeySelective(contract);
        }
        // 定义map，保存货物id和商品id。 因为在添加商品附件时候，需要用商品id
        // key : 货物id;  value: 商品id
        Map<String,String> map = new HashMap<>();

        //3. 添加报运的商品 co_export_product
        //3.1 根据多个购销合同id查询货物
        ContractProductExample cpExample = new ContractProductExample();
        ContractProductExample.Criteria criteria = cpExample.createCriteria();
        criteria.andContractIdIn(asList);

        //查询
        List<ContractProduct> contractProductList = contractProductDao.selectByExample(cpExample);
        //判断
        if (contractProductList!=null){
            //遍历货物的数据
            for (ContractProduct product : contractProductList) {
                //创建商品的对象，将货物的数据封装进去
                ExportProduct exportProduct=new ExportProduct();
                /**
                 * 封装商品对象, 对象拷贝
                 * BeanUtils.copyProperties()
                 *  参数1：数据源对象（有数据的）
                 *  参数2：要拷贝到的目标对象
                 *  注意：
                 *  1. 导入的包是：org.springframework.beans.BeanUtils
                 *  2. 如果导错包，参数数据是不一样的。
                 *     org.apache.commons.beanutils.BeanUtils.copyProperties(目标对象，数据源对象);
                 */
                BeanUtils.copyProperties(product,exportProduct);
                //1.设置商品id
                exportProduct.setId(UUID.randomUUID().toString());
                //设置报运单id
                exportProduct.setExportId(export.getId());
                //往商品表插入数据
                exportProductDao.insertSelective(exportProduct);
                //保存货物id以及对应的商品id,因为附件还会用到
                map.put(product.getId(),exportProduct.getExportId());

            }
        }
        //3、添加商品附件   co_ext_eproduct
        //3.1 根据购销合同，查询购销合同下的附件
        ExtCproductExample extCproductExample=new ExtCproductExample();
        extCproductExample.createCriteria().andContractIdIn(asList);
        List<ExtCproduct> extCproductList = extCproductDao.selectByExample(extCproductExample);

        if (extCproductList!=null){

            //得到每一个附件
            for (ExtCproduct extCproduct : extCproductList) {
                //创建商品附件，拷贝数据进入
                ExtEproduct extEproduct=new ExtEproduct();
                //拷贝数据
                //参数1：目标对象，参数2：数据源对象
                BeanUtils.copyProperties(extCproduct,extEproduct);
                   //设置商品附件id
               extEproduct.setId(UUID.randomUUID().toString());
                //设置报运单id
                extEproduct.setExportId(export.getId());
                //获取货物id
                String contractProductId = extCproduct.getContractProductId();
                //根据货物id获取商品id
                String exportProductId = map.get(contractProductId);
                //设置当前附件的商品id
                extEproduct.setExportProductId(exportProductId);

                // 添加商品附件
                extEproductDao.insertSelective(extEproduct);
            }
        }
        //设置附件数量和商品数量
        export.setExtNum(extCproductList.size());
        export.setProNum(contractProductList.size());

        exportDao.insertSelective(export);
    }

    @Override
    public void update(Export export) {
        //1.修改报运单信息
        exportDao.updateByPrimaryKeySelective(export);
        //2.获取修改的所有商品信息
        List<ExportProduct> productList = export.getExportProducts();
        if (productList!=null){
            //得到每一个商品信息对象
            for (ExportProduct exportProduct : productList) {

               exportProductDao.updateByPrimaryKeySelective(exportProduct);
            }
        }


    }

    @Override
    public void delete(String id) {
        exportDao.deleteByPrimaryKey(id);
    }

    @Override
    public PageInfo<Export> findByPage(ExportExample example, int pageNum, int pageSize) {
        //设置分页第一页开始
        PageHelper.startPage(pageNum,pageSize);
        List<Export> list = exportDao.selectByExample(example);

        return new PageInfo<>(list);

    }

    //报运单修改状态。。。。
    @Override
    public void updateExport(ExportResult exportResult) {
        // 1. 修改报运单： 状态、备注
        // 1.1 获取报运单id
        String exportId = exportResult.getExportId();//从返回值哪里获取到报运单id
        // 1.2 创建对象、设置修改的字段、修改条件
        Export export=new Export();
        export.setId(exportId);
        export.setState(exportResult.getState());
        export.setRemark(exportResult.getRemark());

        // 1.3 修改
        exportDao.updateByPrimaryKeySelective(export);


        //2.修改商品
        // 2. 修改报运的商品： 交税金额
        // 2.1 获取商品集合
        Set<ExportProductResult> productResults = exportResult.getProducts();
        // 2.2 遍历
        if (productResults!=null){
            //得到每一个商品的对象
            for (ExportProductResult productResult : productResults) {
                //2.3 创建商品对象，修改交税金额
                  ExportProduct exportProduct=new ExportProduct();
                // 修改商品交税金额
                exportProduct.setId(productResult.getExportProductId());
                exportProduct.setTax(productResult.getTax());
                exportProductDao.updateByPrimaryKeySelective(exportProduct);
            }
        }




    }
}
